Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Send post JSON request

Приветствую! Поделитесь, кто какие либы использует для упрощения посылки POST JSON запроса на сервер.

Спасибо!
Ответ: Для подачи HTTP запросов ранее была наиболее популярна библиотека Apache HttpClient, и в интернете больше всего примеров с ней. Однако сейчас она заменена на Apache HttpComponents. Она несовместима по исходному коду. Поэтому я перевёл интересующие примеры с HttpClient на HttpComponents и пользуюсь, в том числе для POST запросов с JSON.
Вопрос: отправка POST request с авторизацией

Всем привет!

задача такова, нужно отправить запрос на сервер
https://[api_key]:[password_key]@pay.payorange-pay.com/index.php/api/v1/widget/transactions


пример такой
curl https://pay.payorange-pay.com/index.php/api/v1/widget/transactions \
                  -u [API_KEY]:[PASSWORD_KEY] \
                  -d reference_id=400 \
                  -d amount=400 \
                  -d currency=USD \
                  -d client_ip=192.168.0.1 \
                  -d email=client@domain.ltd \
                  -d description=Example credit card charge \
                  -d pay_method=card




Делаю так
      using (var client = new WebClient())
            {
                NetworkCredential myCreds = new NetworkCredential("API_KEY", "PASSWORD_KEY");
                client.Credentials = myCreds;
                byte[] bret = client.UploadData("https://pay.payorange-pay.com/index.php/api/v1/widget/transactions/", "POST",
               System.Text.Encoding.ASCII.GetBytes("reference_id=hello&amount=world;currency=RUB;client_ip=192.168.0.1;email=client@domain.ru;description=value2;pay_method=card"));

                string sret = System.Text.Encoding.ASCII.GetString(bret);
            }


идет ошибка:
The remote server returned an error: (401) Unauthorized.

тогда делаю так
  var request = WebRequest.Create("https://pay.payorange-pay.com/index.php/api/v1/widget/transactions?reference_id=hello&amount=world&currency=RUB&client_ip=192.168.0.1&email=client@domain.ru&description=value2&pay_method=card");
            string userName = "API_KEY";
            string userPassword = "PASSWORD_KEY";
            string authInfo = userName + ":" + userPassword;
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Headers["Authorization"] = "Basic " + authInfo;
            var response = request.GetResponse();

опять ошибка:
The remote server returned an error: (405) Method Not Allowed.

вроде должно все просто быть, подскажите что не так делаю?
Ответ: В общем разобрася, может кому на будующее, можно тестировать только на домене который указали и дали его IP для генерации ключей!
а так все верно было)
Вопрос: Http POST request, wininet, winsock

Значит так.
Есть PHP скрипт, выводящий все параметры, переданные в запросе.
PHP
1
2
3
4
<?php
 echo "hello!\r\n";
 var_dump($_REQUEST);                
?>
При попытке сделать к нему GET запрос из программы, всё работает.
С POST всё сложней. Из браузера отрабатывает на ура, а вот из программы выводит пустой массив. Пробовал делать запрос и WinSock и WinInet, ничего не выводит, без ошибок, но запрос не проходит. В чём может быть проблема? Может ему какой-нибудь заголовок подсунуть?
P.S. Код запроса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
LPCSTR szAcceptBytes = "*/*";
    char szData[] = "a=b&c=d";
    DWORD read;
    char buffer[1024];
    __memset(buffer, 0, sizeof(buffer));
    HINTERNET hInet = InternetOpenA("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0);
    HINTERNET hSession = InternetConnectA(hInet, "tetris.hol.es", 80, "", "", INTERNET_SERVICE_HTTP, 0, 1u);
    HINTERNET hRequest = HttpOpenRequestA(hSession, "POST", "echo.php", NULL, "tetris.hol.es", 0, 0, 1);
    HttpSendRequestA(hRequest, "", 0, szData, sizeof(szData) - 1);
    InternetReadFile(hRequest, &buffer, sizeof(buffer), &read);
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hSession);
    InternetCloseHandle(hInet);
Ответ: Вверх

Добавлено через 18 минут
Разобрался, надо было вручную заголовок Content-Type поставить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LPCSTR szAcceptBytes = "*/*";
    char szData[] = "a=b&c=d";
    char szHeaders[] = "Content-Type: application/x-www-form-urlencoded\r\n";
    DWORD read;
    char buffer[1024];
    __memset(buffer, 0, sizeof(buffer));
    HINTERNET hInet = InternetOpenA("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0);
    HINTERNET hSession = InternetConnectA(hInet, "tetris.hol.es", 80, "", "", INTERNET_SERVICE_HTTP, 0, 1u);
    HINTERNET hRequest = HttpOpenRequestA(hSession, "POST", "echo.php", NULL, "tetris.hol.es", 0, 0, 1);
    HttpSendRequestA(hRequest, szHeaders, sizeof(szHeaders) - 1, szData, sizeof(szData) - 1);
    InternetReadFile(hRequest, &buffer, sizeof(buffer), &read);
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hSession);
    InternetCloseHandle(hInet);
Вопрос: Send() Post запрос

Вот у меня отправляется ответ клиенту (JS)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void ComeWebClients(SOCKET socket2, char * srt1)
    {
        std::stringstream response; // сюда будет записываться ответ клиенту
        std::stringstream response_body; // тело ответа
 
 
            response_body << srt1;
            response << "HTTP/1.1 200 OK\r\n"
            << "Version: HTTP/1.1\r\n"
            << "Content-type: text/javascript; charset=windows-1251\r\n"
            << "Access-Control-Allow-Origin:*\r\n"
            << "Content-Length: " << response_body.str().length()
            << "\r\n\r\n"
            << response_body.str();
            int result = (int)send(socket2, response.str().c_str(), response.str().length(), 0);
 
    if (result == SOCKET_ERROR) 
        {
        // произошла ошибка при отправле данных
            cerr << "send failed: " << WSAGetLastError() << "\n";
        }
    }
В итоге при попытке подключения клиента выползает в консоли:
> Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на отсутствует заголовок CORS 'Access-Control-Allow-Origin');

Что необходимо сделать, что бы все работало?

Добавлено через 23 часа 31 минуту
Может что нибудь на самой ОС блокировать данное подключение?
Ответ: Ая-й, взломом занимаетесь.

Пробел в 11 строчке потерялся после двоеточия.
Вопрос: Отправить POST-запрос через Awesomium

Здравствуйте, господа!
Нужен пример отправки post запроса через Awesomium, например, по нажатию кнопки.
Есть url, на который нужно отправлять запрос и допустим поля login и password.
Как это реализовать?

Для примера что я имею ввиду - в WebBrowser это делается так:
C#
1
2
string data = "email=vasya&pass=123456789";
webBrowser1.Navigate("http://test1.ru/login.php", "_self", System.Text.Encoding.ASCII.GetBytes(data), "content-type:application/x-www-form-urlencoded");

Добавлено через 23 часа 41 минуту
Нашел решение!!!

1. Добавляем новый файл класса к проекту, называем его, например, CustomInterceptor.cs и вставляем в него это:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// CRI.CustomResourceInterceptor
//
//  Author:     Garison E Piatt
//  Contact:    {removed}
//  Created:    11/17/14
//  Version:    1.0.0
//
// Apparently, when Awesomium was first created, the programmers did not understand that someone would
// eventually want to post data from the application.  So they made it incredibly difficult to upload
// POST parameters to the remote web site.  We have to jump through hoops to get that done.
//
// This module provides that hoop-jumping in a simple-to-understand fashion.  We hope.  It overrides
// the current resource interceptor (if any), replacing both the OnRequest and OnFilterNavigation
// methods (we aren't using the latter yet).
//
// It also provides settable parameters.  Once this module is attached to the WebCore, it is *always*
// attached; therefore, we can simply change the parameters before posting to the web site.
//
// File uploads are currently unhandled, and, once handled, will probably only upload one file.  We
// will deal with that issue later.
//
// To incoroprate this into your application, follow these steps:
//  1.  Add this file to your project.  You know how to do that.
//  2.  Edit your MainWindow.cs file.
//      a.  At the top, add:
//              using CRI;
//      b.  inside the main class declaration, near the top, add:
//              private CustomResourceInterceptor cri;
//      c.  In the MainWindow method, add:
//              WebCore.Started += OnWebCoreOnStarted;
//              cri = new CustomResourceInterceptor();
//          and (set *before* you set the Source value for the Web Control):
//              cri.Enabled = true;
//              cri.Parameters = String.Format("login={0}&password={1}", login, pw);
//          (Choose your own parameters, but format them like a GET query.)
//      d.  Add the following method:
//              private void OnWebCoreOnStarted(object sender, CoreStartEventArgs coreStartEventArgs) {
//                  WebCore.ResourceInterceptor = cri;
//              }
//  3. Compile your application.  It should work.
 
using System;
using System.Runtime.InteropServices;
using System.Text;
using Awesomium.Core;
using Awesomium.Windows.Forms;
 
 
namespace CRI
{
    //*  CustomResourceInterceptor
    //  This object replaces the standard Resource Interceptor (if any; we still don't know) with something
    //  that allows posting data to the remote web site.  It overrides both the OnRequest and OnFilterNavigation
    //  methods.  Public variables allow for run-time configuration.
    public class CustomResourceInterceptor : IResourceInterceptor
    {
        // Since the default interceptor remains overridden for the remainder of the session, we need to disable
        // the methods herein unless we are actually using them.  Note that both methods are disabled by default.
        public bool RequestEnabled = false;
        public bool FilterEnabled = false;
 
        // These are the parameters we send to the remote site.  They are empty by default; another safeguard
        // against sending POST data unnecessarily.  Currently, both values allow for only one string.  POST
        // variables can be combined (by the caller) into one string, but this limits us to only one file
        // upload at a time.  Someday, we will have to fix that.  And make it backward-compatible.
        public String Parameters = null;
        public String FilePath = null;
 
        /** OnRequest
        ** This ovverrides the default OnRequest method of the standard resource interceptor.  It receives
        ** the resource request object as a parameter.
        **
        ** It first checks whether or not it is enabled, and returns NULL if not.  Next it sees if any 
        ** parameters are defined.  If so, it converst them to a byte stream and appends them to the request.
        ** Currently, files are not handled, but we hope to add that someday.
        */
        public ResourceResponse OnRequest(ResourceRequest request)
        {
            // We do nothing at all if we aren't enabled.  This is a stopgap that prevents us from sending
            // POST data with every request.
            if (RequestEnabled == false) return null;
 
            // If the Parameters are defined, convert them to a byte stream and append them to the request.
            if (Parameters != null)
            {
                var str = Encoding.Default.GetBytes(Parameters);
                var bytes = Encoding.UTF8.GetString(str);
 
                request.AppendUploadBytes(bytes, (uint)bytes.Length);
            }
 
            // If either the parameters or file path are defined, this is a POST request.  Someday, we'll
            // figure out how to get Awesomium to understand Multipart Form data.
            if (Parameters != null || FilePath != null)
            {
                request.Method = "POST";
                request.AppendExtraHeader("Content-Type", "application/x-www-form-urlencoded"); //"multipart/form-data");
            }
 
            // Once the data has been appended to the page request, we need to disable this process.  Otherwise,
            // it will keep adding the data to every request, including those that come from the web site.
            RequestEnabled = false;
            Parameters = null;
            FilePath = null;
 
            return null;
        }
 
 
        /** OnFilterNavigation
        ** Not currently used, but needed to keep VisualStudio happy.
        */
        public bool OnFilterNavigation(NavigationRequest request)
        {
            return false;
        }
    }
}


2. В основном классе добавляем
C#
1
using CRI;
и перед InitializeComponent(); добавляем

C#
1
2
WebCore.Started += OnWebCoreOnStarted;
            cri = new CustomResourceInterceptor();
3. далее в нашем классе вставляем объявленную функцию
C#
1
2
3
4
private void OnWebCoreOnStarted(object sender, CoreStartEventArgs coreStartEventArgs)
        {
            WebCore.ResourceInterceptor = cri;
        }
4. и там где нужно отправлять post-запрос делаем примерно так:
C#
1
2
3
cri.RequestEnabled = true;
cri.Parameters = String.Format("login={0}&password={1}", login, pw);
WebControl1.Source = new Uri(my_post_url); // где my_post_url - адрес, на который отправляются post-данные.
Всё отлично работает!
Ответ: thefair, как раз таки нет. После отправки post-запроса RequestEnabled ставите в false и потом когда вам опять нужно отправить post-запрос выполняете шаг №4.

То есть RequestEnabled служит как раз флагом, говорящим Awesomium, что сейчас будем отправлять POST-запрос.
Вопрос: curl post - ошибка 504

вообще такая ситуация:
есть внутренний ресурс куда нужно отправлять уведомления от QIWI. к нему не привязан домен, это просто белый IP.

но т.к. требуется https, на домене сайта(https) сделан скрипт который "проксирует" их на внутренний ресурс.
т.е. запросы поступает на скрипт по https и он их перенаправляет на другой IP по http.
сам скрипт для "проксирования" запросов:
Код

test.php
<?PHP
function post($url, $data=array()){
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_POST, 1); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
        $res = curl_exec($ch);
        if(curl_error($ch)){ echo 'Error '.curl_errno($ch).': '.curl_error($ch); }
        curl_close($ch);
        return $res;
    }
    $t = post('http://x.x.x.x:1462/qiwi.php', $_POST);
    echo $t;
    exit();
?>

вроде все просто и должно работать.

при прямом запросе на  - работает корректно и ответ получен.
при запросе к test.php по https без параметров - скрипт пересылает корректно, ответ получает.
при запросе к test.php по https с POST - скрипт подвисает минут на 15-20 и выдает 504 ошибку.
в логах сайта вижу это:
Код

2015/02/14 18:54:25 [error] 1162#0: *5520 upstream prematurely closed connection while reading response header from upstream, 
client: x.x.x.x, server: site_name.ru, request: "POST /test.php HTTP/1.1", upstream: "http://127.0.0.1:8081/test.php", host: "www.site_name.ru"
2015/02/14 19:07:50 [error] 1165#0: *5540 upstream timed out (110: Connection timed out) while reading response header from upstream, 
client: x.x.x.x, server: site_name.ru, request: "POST /test.php HTTP/1.1", upstream: "http://127.0.0.1:8081/test.php", host: "www.site_name.ru"

в логах внутреннего сервера вижу что до него запрос вообще не дошел.

test.php работает на nginx + apache.

не могу понять в чем может быть причина такого поведения и куда дальше копать...

Добавлено @ 20:59
сами post данные небольшие, например: "eshopId=2082622219&paymentId=221232083270875&eshopAccount=RU0045436412211&
recipientAmount=1.00&recipientCurrency=RUR&paymentStatus=3&userName=asd@asd.ru&userEmail=asd@asd.ru&
paymentData=2015-02-02+22%3a23%3a01&orderId=3321747171&serviceName=12312&hash=012701fcb7f4b07b94a669f59cc7398c48
&invoiceId=21059325580&
payerAccount=RU42213312195&paymentAmount=1.00&paymentCurrency=RUR&rupay_payment_sum=1.00&rupay_payment_currency=RUR
&paymentMethod=CardPayment&merchantPaymentAmount=0.96"

Это сообщение отредактировал(а) jone31 - 14.2.2015, 21:00
Ответ:
Вэдээс вэдээсу вэдээс) Даже в разных сборках линукса дефолтные конфиги отличаются. Просто подозрение что nginx, если это он обслуживает https не туда проксирует.
Вопрос: Как передать переменные через http.Send (post запрос)

Здравствуйте уважаемые форумчане!
Имеется макрос для передачи данных в php скрипт, сейчас передаются постоянные данные, которые прописаны в строке 12 кода, который находится ниже:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim http As WinHttpRequest
Set http = New WinHttpRequest
http.Open "POST", "http://myposthelper.ru/poster.php", False
 
http.SetRequestHeader "User-Agent", "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.9.168 Version/11.51"
http.SetRequestHeader "Accept-Charset", "UTF-8"
http.SetRequestHeader "Cache-Control", "no-cache"
http.SetRequestHeader "Keep-Alive", "300"
http.SetRequestHeader "Connection", "Keep-Alive"
http.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
 
http.Send ("access_token=94e63f02957&id=111111111&message=test message")
 
MsgBox (http.ResponseText)
Подскажите, пожалуйста, как передать в эту 12 строку переменные, которые буду брать из ячеек рабочего листа?
Ответ: Вместо + используйте &
Вопрос: Какие данные HTTPS сервер может получать еще, кроме заголовков

Например чтобы определять Proxy или еще что-нибудь.

Проблема такова: Сервер не хочет регистрировать аккаунт с idhttp(synapse тоже самое) ссылаясь proxy or VPN, хотя белый, выделеный IP, с браузера спокойно регистрируется.

Вот заголовки IE, вот заголовки idhttp

Также склоняюсь что неверно работает ssl. Его убираю ничего не меняется, зачем он вообще нужен?
+=Вот код программы
function TForm1.test_socks (proxyadr : string) : boolean;
var
  http : tidhttp;
  coo : tidcookiemanager;
  ssl : tidssliohandlersocketopenssl;
  compressor : tidcompressorzlib;
  //sock : tidsocksinfo;
  PostData:tstringlist;
  html:string;
begin
  result := false;
  coo := tidcookiemanager.create;

  ssl := tidssliohandlersocketopenssl.create;
      ssl.ssloptions.method := sslvTLSv1;
      ssl.port := 443;

  http := tidhttp.create;
      http.ProtocolVersion:=pv1_1;
      http.iohandler := ssl;
      http.readtimeout := 60000;
      http.connecttimeout := 60000;
      http.allowcookies := true;
      http.handleredirects := true;
      http.cookiemanager := coo;
      http.request.useragent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)';
      http.request.acceptencoding := 'gzip, deflate';
      http.HTTPOptions := [hoKeepOrigProtocol];
      http.Request.Connection := 'Keep-Alive';
      http.Request.Accept:='image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*';
      http.Request.ContentType:='application/x-www-form-urlencoded';
      http.Request.Referer:='https://**/signup?ref=neep';
      http.Request.AcceptLanguage:='ru';
      http.Request.CacheControl:='no-cache';
      http.Request.CustomHeaders.Add('UA-CPU: x86');
      http.Request.CustomHeaders.Add('Cookie: PHPSESSID=665918ecb34f75f6bb4346d4667ed251');


  {sock := tidsocksinfo.create;
      sock.authentication := sanoauthentication;
      sock.version := svsocks5;
      sock.host := copy (proxyadr, 1, pos (':', proxyadr) - 1);
      sock.port := strtoint (copy (proxyadr, pos (':', proxyadr) + 1, 5));
      ssl.transparentproxy := sock;}
      compressor := tidcompressorzlib.create;
      http.compressor := compressor;

    PostData:=TStringList.Create;

    PostData.Add('first_name=');
    PostData.Add('last_name=');
    PostData.Add('phone=');
    PostData.Add('email=');
    PostData.Add('email2=');
    PostData.Add('username=');
    PostData.Add('tpin=');
    PostData.Add('tpin2=');
    PostData.Add('password=');
    PostData.Add('password2=');
    PostData.Add('agree=1');
    PostData.Add('g-recaptcha-response=');
    PostData.Add('ocd=register');

    //http.Request.ProxyConnection:='Keep-Alive';
    //IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';


    //#IdHTTP1.AllowCookies := false;



    html:=http.Post('https://**/signup.php',PostData);

    memo1.lines.add(html);


  http.free;
  coo.free;
  compressor.free;
  ssl.free;
  //sock.free;
end;

Может есть способ определить работает ssl или нет?

Сервер 100% HTTPS, ставлю http, ошибка 302 с редиректом на https

И да libeay32 и ssleay32 перепробовал трех видов, выдрали из реально работающих проектов, все разного размера.
Ответ: Забавно, но ssllabs.com дал этому сайту всего лишь рейтинг F, что говорит о высокой степени его уязвимости.
Вопрос: Отправка Post запрос с несколькими параметрами

Ребят, объясните и подскажите, как можно написать пост запрос для отправки на сервер один данных. Немного подробнее о том что отправлять: отправлять два значения с промежутком примерно 5 секунд. Значения числовые, могут быть с плавающей запятой, ну к примеру это могут быть значения датчиком: 36,9 и 30,2. Отправлять нужно на сервер где есть проверка ключа(например ключ может быть таким:11a32def-4288-4a90-b008-604de3bde948). Можно с пояснениями? Пожалуйста!!!

Добавлено через 49 минут
Вот еще код отправляемых данных, только как его на шарп преобразовать хз...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <HTU21D.h> 
#include "DHT.h" 
 
#include <Wire.h> 
 
 
#include <SPI.h> 
#include <Ethernet.h> 
 
//How many values you will be pushing to ThingWorx 
#define propertyCount 2 
#define DHTPIN 5 //number of pin me use 
#define DHTTYPE DHT22 //type sensor 
// Enter a MAC address and IP address for your controller below. 
// The IP address will be dependent on your local network: 
 
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; 
 
char server[] = "name servers"; 
 
EthernetClient client; 
 
//ThingWorx App key which replaces login credentials) 
char appKey[] = "11a32def-4288-4a90-b008-604de3bde948"; 
// ThingWorx Thing name for which you want to set properties values 
char thingName[] = "HTU21DThing"; 
//Interval of time at which you want the properties values to be sent to TWX server 
int timeBetweenRefresh = 5000; 
// ThingWorx service that will set values for the properties you need 
// See the documentation for this tutorial for more information 
char serviceName[] = "setTempAndHumid"; 
 
//Initialize Properties Names and Values Arrays 
char* propertyNames[] = {"Temp", "Humid"}; 
double propertyValues[propertyCount]; 
 
// last time you connected to the server, in milliseconds 
unsigned long lastConnectionTime = 0; 
// state of the connection last time through the main loop 
boolean lastConnected = false; 
 
//Initialize an HTU21D library object to read 
// temperature and humidity data from your connected sensor 
//HTU21D myHumidity; 
DHT dht(DHTPIN, DHTTYPE); 
void setup() { 
//shut down the SD Card pins 
pinMode(5,OUTPUT); 
digitalWrite(5,HIGH); 
 
// start serial port: 
dht.begin(); 
Serial.begin(9600); 
while (!Serial) { 
; // wait for serial port to connect. Needed for Leonardo only 
} 
//initialize HTU21D object to read values from sensors 
// myHumidity.begin(); 
// start the Ethernet connection: 
Serial.println("Trying to get an IP address using DHCP"); 
Ethernet.begin(mac); 
Serial.print("My IP address: "); 
Serial.print(Ethernet.localIP()); 
Serial.println(); 
} 
 
void loop() { 
 
// Reading temperature or humidity takes about 250 milliseconds! 
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) 
/* float h = dht.readHumidity(); 
// Read temperature as Celsius (the default) 
float t = dht.readTemperature(); 
// Read temperature as Fahrenheit (isFahrenheit = true) 
float f = dht.readTemperature(true);*/ 
 
 
// Aquire sensor values 
/* propertyValues[0] = myHumidity.readTemperature(); 
propertyValues[1] = myHumidity.readHumidity();/*/ 
propertyValues[1] =77;//dht.readHumidity(); 
propertyValues[0] =45;//dht.readTemperature(); 
 
// wait the established interval of time before 
// reading values from the sensor 
// and sending them to the TWX server again 
// delay(timeBetweenRefresh); 
if (millis() - lastConnectionTime > timeBetweenRefresh) { 
updateValues(propertyValues, client, server, appKey, thingName, serviceName, propertyNames); 
} 
} 
 
void updateValues(double values[] , EthernetClient &client, char server[], char appKey[], char thingName[], char serviceName[], char* sensorNames[]) 
{ 
//build the String with the data that you will send 
//through REST calls to your TWX server 
char data[80]; 
strcpy(data, "?appKey="); 
strcat(data, appKey); 
strcat(data, "&method=post&x-thingworx-session=true"); 
// if you get a connection, report back via serial: 
if (client.connect(server, 80)) { 
Serial.println("connected"); 
// send the HTTP POST request: 
client.print("POST /Thingworx/Things/"); 
client.print(thingName); 
client.print("/Services/"); 
client.print(serviceName); 
client.print(data); 
client.print("<"); 
for (int idx = 0; idx < propertyCount; idx++) 
{ 
client.print("&"); 
client.print(propertyNames[idx]); 
client.print("="); 
client.print(propertyValues[idx]); 
} 
client.print(">"); 
client.println(" HTTP/1.1");    
client.print("Host: "); 
client.println(server); 
client.println("Content-Type: text/html"); 
client.println(); 
 
client.stop(); 
lastConnectionTime = millis(); 
 
// print the request out 
Serial.print("POST /Thingworx/Things/"); 
Serial.print(thingName); 
Serial.print("/Services/"); 
Serial.print(serviceName); 
Serial.print(data); 
Serial.print("<"); 
for (int idx = 0; idx < propertyCount; idx++) 
{ 
Serial.print("&"); 
Serial.print(propertyNames[idx]); 
Serial.print("="); 
Serial.print(propertyValues[idx]); 
} 
Serial.print(">"); 
Serial.println(" HTTP/1.1"); 
Serial.print("Host: "); 
Serial.println(server); 
Serial.println("Content-Type: text/html"); 
Serial.println(); 
 
 
} 
else { 
// kf you didn't get a connection to the server: 
Serial.println("the connection could not be established"); 
client.stop(); 
} 
}
Ответ: Ehzik, тема миллион раз обсуждалась, используй поиск. Мой пример.
Вопрос: [Python] Передать в POST запросе JSON содержащий кирилицу

Использую API Яндекс Маркета
Вот метод
Подаю на вход JSON содержащий кириллицу получаю пустой JSON.

val = json.dumps({'offers' : [{'name': 'Принтер Panasonic HX-DC3EE White'}]}, ensure_ascii=False)
print(val)
values = val.encode('utf_8')
print(values)
url = 'https://api.partner.market.yandex.ru/v2/campaigns/%d/bids.json' % (idcom)
reg = urllib.request.Request(url, method='POST')
reg.add_header('Content-Type', 'application/json')
reg.add_header('Host', 'api.partner.market.yandex.ru')
reg.add_header('Authorization','OAuth oauth_token="", oauth_client_id="", oauth_login=""')
reg.add_data(values)
try:
        response =  urllib.request.urlopen(reg)
        json_data=response.read().decode("utf8", 'ignore')
        dataj = json.loads(json_data)
        print(dataj)
except  urllib.error.HTTPError as error:
       
        print(error.read())


{"offers": [{"name": "Принтер Panasonic HX-DC3EE White"}]}
b'{"offers": [{"name": "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80 Panasonic HX-DC3EE White"}]}'


Ответ от сервера:

{'bids': []}

Python 3.3
Ответ: BadMF, Вы знаете как это
s = '
doc = urllib.request.urlopen(s).read().decode('cp1251',errors='ignore')
сделать в Python 2.7.13 без urllib.request ?