質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Python 3.x

    6920questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Apache

    1871questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Swift 2

    1334questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • JSON

    1202questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • PostgreSQL

    1101questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

クライアントからのリクエストに対するデータ取得について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 909

mochi9902

score 19

スマホアプリで、クライアントの端末からサーバにリクエストを投げて、その返答を返す単純なことをやっています。

クライアント側:iOS, Swift 2
サーバ側:CentOS7, Python3.5.1, postgresql9.5, apache2.4.x, mod_wsgi

【やりたいこと】
1)クライアント側でメールアドレスをリクエストとしてサーバ側に投げる
2)サーバ側で受け取ったメールアドレスをPython + mod_wsgiで受け取る
3)受け取ったデータをpostgresqlのSQLの引数として問い合わせ
4)SQLで取得したデータをJSONに変換してクライアントに返す
5)クライアント側で受け取ったデータを表示する

【困ったこと】
postgresqlで取得したデータの中に日本語のデータがあります。
Pythonでコンソール出力してみると、unicode化された状態で出力されました。

Apache error.log

# tail /usr/local/apache2/logs/error_log
[Sun May 22 09:00:28.749747 2016] [wsgi:error] [pid 9554:tid 139810162280192] [{'contents': '\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf\xe6\x9c\xac\xe6\x96\x87\xe3\x81\xa7\xe3\x81\x99', 'booktime': '2016/05/17 10:00:00', 'subject': '\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88\xe3\x81\xa7\xe3\x81\x99', 'mailno': '1 ', 'sendtime': None}]
[Sun May 22 09:00:28.749990 2016] [wsgi:error] [pid 9554:tid 139810162280192] [{"contents": "\\u3053\\u308c\\u306f\\u672c\\u6587\\u3067\\u3059", "booktime": "2016/05/17 10:00:00", "subject": "\\u3053\\u308c\\u306f\\u30c6\\u30b9\\u30c8\\u3067\\u3059", "mailno": "1 ", "sendtime": null}]
[Sun May 22 09:00:28.750189 2016] [wsgi:error] [pid 9554:tid 139810162280192] [client 192.168.3.2:51081] mod_wsgi (pid=9554): Exception occurred processing WSGI script '/opt/web/remindermail/getMail.py'.
[Sun May 22 09:00:28.750357 2016] [wsgi:error] [pid 9554:tid 139810162280192] [client 192.168.3.2:51081] TypeError: sequence of byte string values expected, value of type str found
(pyenv3.5) [root@testdb site-packages]#

Python /opt/web/remindermail/getMail.py

# -*- coding: utf-8 -*-
import db.connectionConf as driver
import psycopg2
import psycopg2.extras
import urllib
import cgi
import sys
import io
import umsgpack
import json
import traceback

def application(env, start_response):
  #sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

  if env.get('REQUEST_METHOD') != 'POST':
    print('Invalid Method')
    return applicationResponse('403 Forbidden', '', start_response)

  inputData = env.get('wsgi.input')
  length = int(env.get('CONTENT_LENGTH', 0))
  query = urllib.parse.parse_qs(inputData.read(length))
  accountname = query[b'accountname'][0].decode('utf-8')

  sql = "select mailno,to_char(booktime,'YYYY/MM/DD HH24:MI:SS'),subject,contents,to_char(sendtime,'YYYY/MM/DD HH24:MI:SS') from rm_mail where accountname=%s"
  cur = None
  conn = None

  try:
    conn = psycopg2.connect(
        host = driver.HOST,
        port = driver.PORT,
        database = driver.DATABASE,
        user = driver.USER,
        password = driver.PASSWORD)

    cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
    cur.execute(sql, (accountname, ))
    result = []
    for row in cur:
      rowdata = {"mailno": row[0], "booktime": row[1], "subject": row[2], "contents": row[3], "sendtime": row[4] }
      result.append(rowdata)

    print(result)
    packdata = json.dumps(result)
    print(packdata)
    return applicationResponse('200 OK', packdata, start_response)
  except:
    traceback.print_exc()
    return applicationResponse('500 Internal Server Error', '', start_response)
  finally:
      cur.close()
      conn.close()


def applicationResponse(status, data, start_response):
  response_headers = [('Content-type', 'text/json; charset=utf-8'),('Content-Length', str(len(data)))]
  start_response(status, response_headers)
  return data

参考までにクライアント側ソースコード

// 中略
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let config:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session:NSURLSession = NSURLSession(configuration:config, delegate:nil, delegateQueue:NSOperationQueue.mainQueue())
        let url:NSURL = NSURL(string:"http://*****.com/remindermail/getMail/")!
        let request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
        request.HTTPMethod = "POST"

        let str:NSString = "accountname=****@gmail.com"
        request.HTTPBody = str.dataUsingEncoding(NSUTF8StringEncoding)!

        let task:NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {
            (data, response, error) -> Void in
            if let _ = error {
                print("Request failed with error")
                print(error)
            } else {
                let result = String(data:data!, encoding: NSUTF8StringEncoding)
                print("Request succeeded with data ¥(_)")
                print(result)  //レスポンスされたJSONデータが出力されれば成功
            }
        })
        task.resume()
    }
// 中略

Python側でJSONデータを返す際に、"TypeError: sequence of byte string values expected, value of type str found"というエラーが発生し、おそらく日本語を含めたデータを返すと、こうなるのかなという認識です。

上記のPythonのソースコードでは、subject, contentsに当たる値が日本語であり、これをprintで出力したのがerror.logの1行目、2行目です。

【解決したいこと】
・postgresqlで取得した日本語データをprintで出力の際に、
日本語として出力させたい
・"TypeError: sequence of byte string values expected, value of type str found"を解決し、
日本語を含めたJSONデータを返したい。

どうすればいいのでしょうか?
ご教授お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決

・postgresqlで取得した日本語データをprintで出力の際に、日本語として出力させたい

error.logの内容で問題なかったみたいです。 

・"TypeError: sequence of byte string values expected, value of type str found"を解決し、 
日本語を含めたJSONデータを返したい。

getMail.pyの行末"return data"の部分を

return [data.encode("utf-8")]


に変えるだけで、swift側のresultにデータが入りました。(ナンテコッタイ)
どうも、日本語を含むデータを返すにはbytes型にする必要があったようです。
質問内容のTypeErrorでは、"result data"のdataがstr型になっていたためでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    iOSのSwiftでalamofireを使いjsonをパースする方法。

    はじめましていまSwiftとAlamfireを使いjsonをパース使用としています。 戻り値をパースしようとしているのですが、やり方がわかりません。 どなたかわかる方に教えてい

  • 解決済

    ツイートの投稿

    大学で卒業研究としてTwitterAPIを利用したアプリケーションを開発しています。 その過程で以下のようにツイート投稿のところで行き詰まりました。 同じようなコードでタイムラ

  • 解決済

    Alamofireを使ってレスポンスデータをreturnする方法

    Qiitaの最新記事をAPI経由で取得してTableViewに表示するアプリを勉強がてら現在作っています。 そこで、APIにリクエストし、指定のjsonデータを返り値として取

  • 解決済

    Swift Alamofire2.0から3.0においての、コードの修正方法を知りたい

    前提・実現したいこと RSSリーダーアプリを作成しています。 こちらを参考に進めていました。 http://x1.inkenkun.com/archives/909 あ

  • 受付中

    Alamofire + SwiftyJSONでreturnがnilになる

    前提・実現したいこと Alamofire+SwiftyJSONを利用して、APIからデータを取得・パースして、returnで戻したい。 発生している問題・エラーメッセージ

  • 解決済

    swift3でのサイトのhtml取得

    サイトのhtmlを取得しようと このサイトを目標にこのサイトを見たりしてやってみているのですがどうしてもうまくいきません。 URLSession.shared...の行でエラー

  • 解決済

    指定URLのhtmlを表示させたい

    前提・実現したいこと 指定したURLのhtmlをコンソール上に表示させたいのですが、エラーが出てしまい、困っています。 発生している問題・エラーメッセージ Argumen

  • 解決済

    swiftとphpでpost通信をする

    現在Swiftとphpでpost通信を行おうとしているのですがうまくいきません。 URLSession.shared.dataTaskでerrorはnilになっているものの、期待

同じタグがついた質問を見る

  • Python 3.x

    6920questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Apache

    1871questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Swift 2

    1334questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

  • JSON

    1202questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • PostgreSQL

    1101questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。